# 1. 内置的open函数打开文件有几种模式，它们的区别是什么？
# open方法打开文件有4种主模式：
1.r：只读，打开文件不可写，如果使用write方法则抛出异常
     如果文件不存在，则抛出FileNotFoundError异常
f = open("a.txt", mode="r", encoding="utf-8")
print(f.read())  # 读取内容，如果文件不存在，抛异常FileNotFoundError:
f.write("abc")  # 只读模式下不可写，抛异常io.UnsupportedOperation: not writable

② w模式：表示只写方式打开，如果读取则抛出异常
      如果文件不存在，则直接创建文件
      如果文件存在，则写入会覆盖原文件内容
# 没有a.txt文件
f = open("a.txt", mode="w", encoding="utf-8")  # 原来没有a.txt，用w模式会直接创建
# print(f.read())  # 只写模式，没有读取权限，抛异常io.UnsupportedOperation: not readable
f.write("abc")  # 写入abc
f.close()  # 关闭文件
# 已经存在a.txt文件
f = open("a.txt", mode="w", encoding="utf-8")
f.write("xyz")  # 新写入xyz
f.close()  # 文件关闭后打开a.txt 发现里面只有xyz内容，没有abc，abc被清空了

③ a模式：文件存在，只写打开，在尾部追加内容，无法读取其中内容
      文件不存在，则创建后，只写打开，追加内容
# 文件不存在
f = open("a.txt", "a")  # 不存在会创建文件
f.write("abc")  # 写入abc
f.close()  # 文件关闭可以看到abc

# 文件存在
f = open("a.txt", "a")
# print(f.read()) # a也是只写模式存在，无法读取 io.UnsupportedOperation: not readable
f.write("123")  # 再写入123
f.close()  # 关闭文件，打开a.txt可以看到里面在abc的后面追加了123，这个是没有换行符的abc123

④ x模式：文件存在则抛异常
       文件不存在，则创建后，只写打开，写入新内容

# 文件存在，抛异常FileExistsError: [Errno 17] File exists: 'a.txt'
f = open("a.txt","x")
f.write("123")
f.close()

# 文件不存在，创建文件再写入，不能读
f = open("a.txt","x") # 创建文件
f.write("123") # 写入
f.close() # 关闭

多个主模式不能共存，比如rw模式、ra模式、aw模式等等
f = open("a.txt",mode="rw",encoding="utf-8") # 报错ValueError: must have exactly one of create/read/write/append mode
f = open("a.txt",mode="aw",encoding="utf-8") # ValueError: must have exactly one of create/read/write/append mode


# 2. 使用base64解码“bWFnZWR1LmNvbQ==”，使用base64编码”[magedu.com](http://magedu.com)”，分别给出它们的解码和编码结果。
import base64

str1 = "bWFnZWR1LmNvbQ=="
str2 = "[magedu.com](http://magedu.com)"
print(base64.b64decode(str1).decode("utf-8"))  # magedu.com
print(base64.b64encode(str2.encode("utf-8")))  # b'W21hZ2VkdS5jb21dKGh0dHA6Ly9tYWdlZHUuY29tKQ=='

# 3. 列出本周讲的几种序列化方法，它们各自的特点是什么?
pickle：python标准库中提供的方法，python程序之间可以使用pickle序列化，几乎所有的数据类型（列表、字典、集合、类等）都可以使用pickle序列化，但是如果是跨平台、跨语言、跨协议的就可能出现兼容性问题
json：轻量级的数据交换格式，用文本格式来存储数据，长的像字典，实际都是字符串，但是只支持基本数据类型（列表、元组、字典等）的序列化，如日期格式、类就不行，多用于跨语言传输数据
msgpack：非常高效的二进制序列化格式，比json更快速更轻巧，也可跨语言通信，兼容json和pickle

# 4. 写一个Python脚本实现找到/tmp目录及其子目录下的以.htm结尾的文件，把其后缀名改为.html

from pathlib import Path

def change_htm(dic):
    files = Path(dic).rglob("*.htm")
    for file in files:
        print(file)
        new_file = file.with_suffix(".html")
        file.rename(new_file)
    print("替换完成")

change_htm(r"E:\tmp")

